iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
Vibe Coding

別再只叫 AI 做漂亮一點:30 天 Vibe Coding UI 元件驗收實驗系列 第 9

Day 9|輸入日期、選時間還是看整月?五種日期時間元件怎麼選

  • 分享至 

  • xImage
  •  

Day 9|輸入日期、選時間還是看整月?五種日期時間元件怎麼選

安安~我是ChiYu~

昨天,LumenDesk 的活動預算、人數和餐點數量終於各自找到適合的控制。沒想到我一按下「下一步」,AI 又端出一張佔掉快半頁的月曆。

昨天結尾留下的,就是這張同時身兼四職的 Calendar。

AI 第一版把活動日、報名區間、預約時間與整月活動塞進同一張 Calendar

圖 1:和昨天結尾是同一個 AI 第一版。單日、區間、時間與行程全部疊在月份格子裡,一次點擊沒有明確任務。

活動日期找它、報名期間找它、預約時段還是找它。這張 Calendar 一口氣兼任日期輸入、挑選日期、瀏覽活動、選擇時間與設定區間,工作量大到只差沒幫它申請加班費。

回頭看原始需求,只有一句:

幫我在活動報名頁加一個 Calendar。

有一說一,AI 沒有做錯。我說要 Calendar,它真的給了 Calendar。只是這句需求完全沒提到使用者要輸入一個確切日期、挑一天、看整月活動、選 09:30,還是設定 8 月 18 日到 8 月 22 日的報名期間。

五個任務都看得到日期,背後卻是五種不同操作。如果只交代「做一個日曆」,AI 最容易生成一張看起來很完整、實際上無法驗收的月曆:過去日期能不能選不知道、選完有沒有套用不知道、開始日和結束日選反了也不知道。

我先打開日期與時間元件比較頁,把這五份工作攤開來看。

日期時間元件比較頁:先判斷使用者要輸入、選取或瀏覽

圖 2:同樣顯示日期,直接輸入、挑一天、瀏覽行程、選時段與設定區間,是五種不同任務。

Date Range Picker 選反:我先選 8 月 18 日,再選 8 月 15 日

在開始背元件名稱前,我先對網站上的 Date Range Picker 做了一次不太友善的操作。

我先選 2026-08-18 當開始日,再故意選一個更早的 2026-08-15 當結束日。這時元件大致有三種反應:

  • 偷偷把兩個日期交換,讓畫面看起來沒事。
  • 把剛才選的內容全部清空,請使用者重來。
  • 保留兩個日期,指出結束日早於開始日,讓使用者自己修正。

我選第三種。

因為系統不知道使用者點錯的是開始日,還是結束日。自動交換看起來很貼心,實際上可能把錯誤包裝成成功;全部清空更乾脆,順便把使用者剛才做的事一起抹掉。

網站 Demo 會保留兩個值,並顯示:「結束日 2026-08-15 早於開始日 2026-08-18;已保留兩個值,請重新選取開始日後再選結束日。」這才是我想驗收的日期介面:發生錯誤時,畫面要留下證據,也要交代下一步。

這場小事故也讓日期元件的選型變得清楚。重點從來不是月曆長得漂不漂亮,而是使用者正在完成哪一種時間任務。

五種日期元件,各自回答一個問題

我會先問使用者是在「提供日期」、「從限制裡選日期」,還是「瀏覽日期上的資料」。接著才處理單日、時間或區間。

日期與時間元件的選型地圖

圖 3:先從任務判斷元件,而不是看到日期就放 Calendar。

使用者要做的事 適合的元件 先說清楚的規則
直接輸入或貼上一個確切日期 Date Input 格式、範例、最早與最晚日期,以及儲存時不能因時區換算而跨日。
從可用日期中選一天 Date Picker 已選、今天、不可選日期,以及選完後的結果。
瀏覽這個月有什麼活動 Calendar 月份切換、活動摘要與今天的位置。
選擇一天中的時間 Time Picker 12/24 小時制、可預約時段與分鐘步進。
選擇開始與結束日期 Date Range Picker 選取順序、封鎖日期、結束不可早於開始、共幾天。

如果帶回 LumenDesk 的正式規則,可報名日還只開放週一到週五、預約必須晚於目前時間兩小時,日期區間也不能跨過結算日。這些條件不會因為畫面放了一張月曆就自動成立,仍要逐條寫進選取規則與錯誤回饋。

這五種元件不需要互相搶工作。活動公文上的確切日期交給 Date Input;可報名日期交給 Date Picker;整月活動交給 Calendar;預約時段交給 Time Picker;報名起訖則交給 Date Range Picker。

名稱仍然不是全球統一。許多設計系統會把「日期輸入欄+跳出的月曆」整組叫 Date Picker,Calendar 也可能同時支援瀏覽與選取。這篇刻意依任務拆成五種,是要讓 AI 知道畫面此刻在收一個值、選一段時間,還是瀏覽整月資料,不是要替所有元件庫重新發身分證。

日期與時間元件完整比較 也保留了可操作版本,可以直接切換畫面確認差異。

Date Input:手上已經有日期,就別逼人翻月曆

Date Input|日期輸入欄 適合輸入或貼上一個已知日期。LumenDesk 的管理員已經從公文拿到活動日 2026-08-18,這時直接輸入通常比一個月、一個月翻過去更快。

Vibe UI Atlas 的 Date Input 實際 Demo:輸入固定格式的活動日期

圖 4:Date Input 讓人輸入或貼上確切日期。格式、可用範圍與錯誤規則要在欄位附近。

Date Input 不能只留一個空格,再期待 Placeholder 一肩扛起說明責任。格式 YYYY-MM-DD、輸入範例、最早可用日和錯誤原因,都該出現在欄位附近。

我在 Demo 輸入 2026-08-10,欄位沒有突然失憶,而是保留原值並顯示「活動日期不可早於 2026-08-12」。保留內容很重要,因為使用者只要改其中一段,不必重新猜自己剛才輸入了什麼。

還有一個很容易被畫面藏起來的細節:原生 input type="date" 的值會正規化為 yyyy-mm-dd,顯示格式卻可能隨瀏覽器語系改變。畫面格式與 API 儲存格式不能靠默契,Vibe Coding 時要直接寫進需求。MDN 的 date input 說明

Date Picker:從可選日期挑一天,選完還要看得到結果

Date Picker|日期選擇器 適合「我不知道日期數字,但知道想選下週二」的情境。它把可用日期攤開,讓人從限制中挑一天。

UI 元件百科的 Date Picker 實際操作畫面

圖 5:Date Picker 的重點不是格子,而是已選、不可選與選取後回到欄位的結果。

網站 Demo 中,灰色且帶刪除線的日期代表已過,從 12 日開始才可報名。選到日期後,月曆收合,欄位顯示完整結果。如果畫面只把月曆關掉,使用者還得重新打開確認,等於剛才那一下點得很沒安全感。

自訂日期挑選器也不能把鍵盤留在門外。日期按鈕要能取得焦點;開啟後將焦點帶到合理日期,選定後再回到觸發按鈕。W3C 的範例還處理了按鈕名稱、焦點回復與月份宣告,因為「點得到」只完成滑鼠使用者的版本。WAI-ARIA Date Picker Dialog Example

Calendar:讓人看整個月,不是拿來代打所有日期欄位

Calendar|月曆 處理的是「這個月有什麼」:活動日程、會議排程、預約量與截止日。使用者的注意力在整月資訊,不只在某一個日期值。

Vibe UI Atlas 的 Calendar 實際 Demo:瀏覽月份與查看有活動的日期

圖 6:Calendar 用來瀏覽日程。它需要目前月份、切換月份、今天位置與事件摘要。

一個可用的 Calendar 要能切換月份、辨識今天與有活動的日期,點下日期後還看得到活動摘要。切到下個月時,標題、日期格和事件資料也要一起更新,不能只有月份名稱很努力,內容還停在原地。

如果表單只要選 2026-08-18,常駐一整張月曆反而會佔空間、搶走焦點。這時 Date Picker 或 Date Input 更貼近任務。Calendar 顯示的格子比較多,不代表它自動升級成日期界的萬用工具。

我會把 AI Prompt 寫成:

這個 Calendar 用來瀏覽活動日程,不是表單輸入欄位。要有上個月與下個月按鈕、目前年月、今天與有活動日期的文字摘要;切換月份時,日期格與事件資料都要一起更新。

這段話沒有指定圓角、陰影和配色,卻已經足夠驗收 Calendar 到底會不會工作。

Time Picker:09:30 不只是一串看起來像時間的數字

Time Picker|時間選擇器 負責一天中的時刻。採 12 小時制或 24 小時制、幾點開始營業、一次跳幾分鐘,都會直接改變使用者能選到什麼。

Vibe UI Atlas 的 Time Picker 實際 Demo:選擇可預約的時間與分鐘步進

圖 7:Time Picker 要讓人看懂 12/24 小時制、可選時段與分鐘粒度,不能只丟下一個時鐘圖示。

LumenDesk 的預約時間採 24 小時制,營業時間是 09:00 到 18:00,每 15 分鐘一格。我輸入 08:45 時,畫面應保留內容並指出可選範圍;改成 09:30 後,才確認可以預約。

原生 input type="time" 的值使用 24 小時 HH:mm 格式,minmaxstep 可以描述範圍和秒數步進。不過產品仍要把規則直接說給人看,不能期待每位使用者都先去研究 HTML 規格再填表單。MDN 的 time input 說明

Date Range Picker:兩個日期放一起,不會自動變成一段區間

Date Range Picker|日期區間選擇器 處理報名期間、住宿日期與查詢區間。它不只收兩個日期,還要管理先後順序、區間中的日期、封鎖日與總天數。

UI 元件百科的 Date Range Picker 實際操作畫面

圖 8:有效的日期區間同時顯示開始、結束、區間視覺與天數摘要。

網站 Demo 會先收開始日,再收結束日;有效範圍以連續樣式標示,上方同步顯示開始、結束與共幾天。過去日期則直接不可選。

真正需要壓力測試的,還是前面那次反向選取。Vibe Coding 時,我會要求 AI 同時交代三件事:錯誤發生時保留哪些值、訊息要點出哪條規則,以及使用者下一步從哪裡重選。只寫「結束日不能早於開始日」,AI 仍可能自動交換、直接清空,或亮一圈紅框後就下班。

交給 AI 的不是一張月曆,是五份可驗收的日期規則

把「幫我加一個 Calendar」改寫後,Prompt 會變成這樣:

為 LumenDesk 的活動管理流程建立日期與時間介面,但不要把它們混成同一個 Calendar:

1. 「活動日期」有一個 Date Input,讓管理員輸入或貼上 YYYY-MM-DD。欄位旁要顯示格式範例;只接受 2026-08-12(含)之後的有效日期。格式錯誤或日期已過時,保留原輸入並說明修正方式。
2. 「報名者選擇活動日期」使用 Date Picker。開啟月曆後,過去日期與週末不可選,只開放週一到週五;已選日期、今天與不可選日期要清楚區分。選取後關閉月曆,欄位顯示完整日期,重設可以回到未選狀態。
3. 「活動日程」使用 Calendar,只負責瀏覽月份和查看有活動的日期。要有上個月、下個月、目前年月、今天與活動數量摘要;切換月份時日期格與事件資料一起更新。
4. 「預約開始時間」使用 Time Picker,採 24 小時制,可選 09:00 到 18:00,每 15 分鐘一格。若預約日是今天,最早只能選台北時間目前時刻兩小時後的下一個可用時段;今天已沒有合格時段時,直接提示改選其他日期。錯誤時間保留內容並顯示可選規則。
5. 「活動報名期間」使用 Date Range Picker。先選開始日再選結束日;2026-08-12 之前不可選,也不得跨過系統提供的結算日。若結束日早於開始日,保留兩個值並說明如何修正。有效區間要顯示開始、結束與含首尾共幾天。

所有日期按鈕與控制都要可用鍵盤操作;不要只用顏色表達已選、不可選或錯誤狀態。

這份 Prompt 沒有要求 AI 把月曆做得更華麗,而是把五種元件的工作、限制、錯誤與重設方式分開。畫面可能沒有第一版那麼「一張月曆包辦全部」的氣勢,但至少每個日期都有地方去。

交付前,我會真的操作五次:輸入格式錯誤的日期、挑一個過去日期、把 Calendar 切到下個月、輸入營業時間外的時段,再選一次結束早於開始的日期區間。

只要其中一次讓我不知道剛才發生什麼、系統替我改了什麼,或下一步該去哪裡修,這個日期介面就還不能算完成。

日期各自歸位,附件開始排隊出事

調整後,管理員可以直接輸入公文上的活動日期,報名者從可用日期挑一天,Calendar 負責瀏覽整月活動,Time Picker 選擇 15 分鐘一格的預約時段,Date Range Picker 再處理報名起訖。

我故意選反日期時,畫面也會保留兩個值、指出規則並告訴我怎麼重選,不會偷偷把資料修成一副什麼事都沒發生的樣子。

日期處理完,我原本以為下一步只剩「上傳海報」。結果海報、參與名單和場地照片一起拖進去後,一份格式錯誤、一份卡在傳送中,還有一份直接失敗。

先看 AI 第一版。入口做得很完整,三份檔案進去之後會發生什麼,畫面選擇先不回答。

模糊 Prompt 產生的第一版檔案上傳區

圖 9:虛線框、上傳圖示與選檔按鈕都到齊;格式、大小、逐筆狀態、取消、重試與送出前預覽則沒有位置。

明天,我們來看看一個漂亮的 Dropzone,為什麼接不住三份命運完全不同的檔案。

延伸閱讀

資料查閱:2026-08-07。


上一篇
Day 8|數值要輸入、拖曳還是評分?六種數值控制的選型
系列文
別再只叫 AI 做漂亮一點:30 天 Vibe Coding UI 元件驗收實驗9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言